#include<bits/stdc++.h> 
using namespace std;
// 	如果一个素数倒序后仍然是素数，我们称之为可倒转素数，例如73和37。现在给定
//  两个正整数N<100000以及1<D≤10，我需要判断D进制下的N是否为素数
//1.每个输入包含若干测试用例，每一个测试用例都由N和D组成。输入以负数N结尾
//2.对于每个测试用例，输出Yes或者No来表示是否为可倒转素数
//3.进制转换，素数判断，字符串倒序 
map<char, int> numbers;	//字符转数字 
map<int, string> chars;	//数字转字符 
void initMap(){
	for(int i = 0;i<10;i++){
		char c = '0' + i;
		numbers[c] = i;
		chars[i] = c;
	}
}	//初始化上面两个map 
long long radixChange(string s, int radix){
	long long sum_ = 0;
	int l = s.length();
	for(int i =0;i<l;i++){
		sum_ += numbers[s[i]] * pow(radix, l-i-1);
	}
	return sum_;
}	//根据传入的进制，将字符串转为10进制 
string radixChange2(long long n, int radix){
	string s;
	while(n!=0){
		s = chars[(n%radix)]+s;
		n /= radix;
	}
	return s;
}	//根据传入的进制，将数字n转为radix进制 
bool isPrime(long long n){
	if(n<=1) return false;
	if(n!=2 && n%2==0) return false;
	int max_ = sqrt(n);
	for(long long i = 3;i<max_+1;i=i+2){
		if(n%i==0) return false;
	}
	return true;
}	//判断一个数是否为素数 
string reverse(string s){
	int l = s.length();
	string ans = "";
	for(int i = 0;i<l;i++){
		ans += s[l-i-1];
	}
	return ans;
}	//倒转字符串 
int main(){
	initMap();
	while(true){
		string N;
		int D;
		cin>>N;
		if(N[0]=='-') break;	//如果是负数就跳出循环 
		cin>>D;
		long long n = radixChange(N,10);	//获得数字n 
		long long r = radixChange(reverse(radixChange2(n,D)),D);	//获得倒转的数字r 
		if(isPrime(n)&&isPrime(r))cout<<"Yes"<<endl;
		else cout<<"No"<<endl; 
	}
	return 0;
}